﻿'Imports Fgv.Framework.Email.Dominio
'Imports Spring.Data.NHibernate.Support
'Imports NHibernate

'Namespace Email.Servicos

'    ''' <summary>
'    ''' Classe de Envio de E-mail
'    ''' </summary>
'    ''' <remarks></remarks>
'    Public Class EnviaEmail

'        Private _processando As Boolean = False

'        Private _EnvioEmailServico As IEnvioEmailServico

'        ''' <summary>
'        ''' Propriedade Serviço de envio de e-mail (apenas escrita)
'        ''' </summary>
'        ''' <value>interface IEnvioEmailServico</value>
'        ''' <remarks></remarks>
'        Public WriteOnly Property EnvioEmailServico() As IEnvioEmailServico
'            Set(ByVal value As IEnvioEmailServico)
'                _EnvioEmailServico = value
'            End Set
'        End Property

'        Private _SessionFactory As ISessionFactory

'        Public WriteOnly Property SessionFactory() As ISessionFactory
'            Set(ByVal value As ISessionFactory)
'                _SessionFactory = value
'            End Set
'        End Property

'        ''' <summary>
'        ''' Método chamado pelo Quartz (execução de tarefas agendadas), responsável pelo envio assíncrono dos emails do sistema. 
'        ''' </summary>
'        ''' <remarks>Esse método realiza uma busca pelas solicitações de email não atendidas, levando em conta o status (N se não foi atendida) e a data de agendamento (apenas solicitações expiradas são atendidas)</remarks>
'        Private Sub EnviaEmails()
'            Using ss As New SessionScope(_SessionFactory, True)
'                Try
'                    If Not _processando Then
'                        _processando = True
'                        'busca as solicitações de email
'                        Dim _listaSolicitacoes As IList(Of SolicitacaoEnvioEmail) = _EnvioEmailServico.BuscarTodasSolicitacoesEnvioEmail
'                        'se há solicitações
'                        If Not IsNothing(_listaSolicitacoes) Then
'                            For Each _solicitacao As SolicitacaoEnvioEmail In _listaSolicitacoes
'                                'se o email ainda não foi enviado
'                                If _solicitacao.Status = SolicitacaoEnvioEmail.StatusEnvio.Agendado And _solicitacao.DataHoraAgendada <= Now Then
'                                    Dim _email As Dominio.Email = _solicitacao.Email
'                                    Dim _dadosEnvio As EmailEnvioConta = _email.EmailEnvioConta
'                                    Dim _mensagem As New Mensagem
'                                    _mensagem.msgTo.Add(_solicitacao.EmailDestinatario)
'                                    _mensagem.msgSubject = _solicitacao.Assunto
'                                    If Not String.IsNullOrEmpty(_solicitacao.BCC) Then
'                                        Dim _emails As String() = Split(_solicitacao.BCC, AppGlobal.SeparadorEmails)
'                                        For index = 0 To _emails.Length - 1
'                                            _mensagem.msgBcc.Add(_emails(index))
'                                        Next
'                                        _emails = Nothing
'                                    End If
'                                    If Not String.IsNullOrEmpty(_solicitacao.CC) Then
'                                        Dim _emails As String() = Split(_solicitacao.CC, AppGlobal.SeparadorEmails)
'                                        For index = 0 To _emails.Length - 1
'                                            _mensagem.msgCc.Add(_emails(index))
'                                        Next
'                                        _emails = Nothing
'                                    End If
'                                    _mensagem.msgFrom = _dadosEnvio.EmailRemetente
'                                    If Not String.IsNullOrEmpty(_dadosEnvio.SenhaRemetente) Then
'                                        _mensagem.msgFromPassword = _dadosEnvio.SenhaRemetente
'                                    End If
'                                    _mensagem.msgNomeFrom = _dadosEnvio.NomeRemetente
'                                    If Not String.IsNullOrEmpty(_solicitacao.ReplyTo) Then
'                                        _mensagem.msgReplyTo = _solicitacao.ReplyTo
'                                    End If
'                                    _mensagem.msgMessage = IIf(String.IsNullOrEmpty(_solicitacao.Texto), String.Empty, _solicitacao.Texto)
'                                    _mensagem.msgMessageHTML = IIf(String.IsNullOrEmpty(_solicitacao.Texto), String.Empty, _solicitacao.TextoHtml)

'                                    'Anexos
'                                    For Each anexo As EmailAnexo In _email.Anexos
'                                        _mensagem.AdicionaAnexo(anexo.Arquivo)
'                                    Next
'                                    For Each anexo As SolicitacaoEnvioEmailAnexo In _solicitacao.Anexos
'                                        _mensagem.AdicionaAnexo(anexo.Arquivo)
'                                    Next
'                                    _mensagem.Enviar()
'                                    _mensagem = Nothing
'                                    _EnvioEmailServico.RegistrarEmailEnviado(_solicitacao.Id)
'                                End If
'                            Next
'                        End If
'                        _listaSolicitacoes = Nothing
'                    End If
'                Catch ex As Exception
'                    Dim et As New AppException("EnviaEmails", ex.Message, ex)
'                Finally
'                    _processando = False
'                    ss.Close()
'                End Try
'            End Using
'        End Sub

'    End Class
'End Namespace
